請別打我,這篇就是為了獎牌而發的。(說要把獎牌送人....等我另外一邊完賽我會認真處理這邊)
這一篇是寫UVa和Leetcode還有Newcode的題目。
一天最多發五題,而之後另外一邊完賽後,則是看我當天寫完幾題我就發幾題。
無論如何刷題都是必須的,畢竟我的目標還是考研為優先?(到底誰願意一起陪我考清華!)
最近大多都在寫專案,寫Python,但我深知現在如果叫我上機考C++......呵呵,算了吧,手感肯定不對。
(每次在轉換程式碼的時候那種if後到底有沒有括號,是大括還是縮排...他xx的....)
考慮以下的演算法:
- 輸入 n
- 印出 n
- 如果 n = 1 結束
- 如果 n 是奇數 那麼 n=3n+1
- 否則 n=n/2
- GOTO 2
例如輸入 22, 得到的數列: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
據推測此演算法對任何整數而言會終止 (當列印出 1 的時候)。雖然此演算法很簡單,但以上的推測是否真實卻無法知>道。然而對所有的n ( 0 < n < 1,000,000 )來說,以上的推測已經被驗證是正確的。
給一個輸入 n ,透過以上的演算法我們可以得到一個數列(1作為結尾)。此數列的長度稱為n的cycle-length。上面提到的例子, 22 的 cycle length為 16.
問題來了:對任2個整數i,j我們想要知道介於i,j(包含i,j)之間的數所產生的數列中最大的 cycle length 是多少。
硬幹,i到j之間會產生的cycle length算出來。選擇最大的即可。
#include<iostream>
using namespace std;
int compute(int n)
{
int cyclelength=1;
while(n!=1)
{
if(n%2==1)
n=3*n+1;
else
n/=2;
cyclelength++;
}
return cyclelength;
}
int main(){
int start,end;
while(cin>>start>>end)
{
int cyclelength=0,temp;
if(start<end)
{
for(int i=start;i<=end;i++)
{
temp=compute(i);
if(temp>cyclelength)
cyclelength=compute(i);
}
}
else
{
for(int i=start;i>=end;i--)
{
temp=compute(i);
if(temp>cyclelength)
cyclelength=compute(i);
}
}
cout<<start<<" "<<end<<" "<<cyclelength<<endl;
}
}
把一個數字反轉並相加的方法很簡單:就是把數字反轉並加上原來的數字。假如這個和不是一個迴文(指這個數字從左>到右和從右到左都相同),就一直重複這個程序。舉例說明:
195 開始的數字
591
................
786
687
................
1473
3741
................
5214
4125
................
9339 迴文出現了在這個例子中,經過了4次相加後得到了迴文9339。幾乎對所有的整數這個方法都會得到迴文,但是也有有趣的例外。>196是第1個用這個方法找不到迴文的數字,然而並沒有證明該迴文不存在。
現在給你一個開始的數字,你的任務就是求出經過多少次相加後,會產生哪一個迴文。對所有的測試資料,你可以假設:1. 都會有1個答案。2. 在1000個相加內都會得到答案。 3. 產生的迴文不會大於4294967295.
硬幹。(我好像寫程式碼都特別直觀)
我們需要把數字反轉過來的reverse(),將數字反轉後先判斷是否相同(回文),如果沒有就繼續進行相加,同時記錄加了幾次,這樣就行。
#include<iostream>
using namespace std;
unsigned int reverse(unsigned int zheng){
unsigned int fang=0;
while(zheng){
fang=fang*10+zheng%10;
zheng/=10;
}
return fang;}
int main()
{
int test;
cin>>test;
while(test--){
unsigned int number,reverse_number,add=0;
cin>>number;
do{
number=number+reverse(number);
add++;
}while(number!=reverse(number));
cout<<add<<" "<<number<<endl;
}
}
在小學時我們都做過加法的運算,就是把2個整數靠右對齊然後,由右至左一位一位相加。
如果相加的結果大於等於10就有進位(carry)的情況出現。
你的任務就是要判斷2個整數相加時產生了幾次進位的情況。
把兩數依位數相加,且考慮到後一位進位沒,就能解決這個問題。
#include<iostream>
using namespace std;
int main()
{
int n1,n2;
while(cin>>n1>>n2)
{
if(n1==0&&n2==0)
break;
int carry=0,c=0;
while(n1!=0||n2!=0)
{
if(n1%10+n2%10+c>9)
{
carry+=1;
c=1;
}
else
c=0;
n1/=10;
n2/=10;
}
if(n1%10+c>9||n2%10+c>9)
carry+=1;
if(carry==0)
cout<<"No carry operation."<<endl;
else if(carry==1)
cout<<"1 carry operation."<<endl;
else
cout<<carry<<" carry operations."<<endl;
}
}
據說,90%的大學一年級新生期望他們自己的成績能在全班平均之上,請你來幫忙驗證看看他們有沒有達成目標。
輸入的第一列有一個整數 C 代表以下有多少組測試資料。每組資料的第一個整數 N 代表班級總人數 ( 1 <= N <= 1000 )。接下來有N個以空白或換行來間隔的整數,代表每個學生的期末總成績 ( 0 <= 分數 <= 100 )。
對每組測試資料輸出一列,算出有多少百分比的學生成績比全班平均高,請四捨五入到小數第三位。
先算出班級平均,再將平均以上的同學除以全部同學得到百分比。
比較值得紀錄的是<iomanip>
他是用來處理數字格式化很好的工具
其中setprecision()
是代表輸出的位數,但如果數字是3.1415926,我們直接使用setprecision(2)
他並不是顯示3.14而是3.1。所以如果我們是規定他要顯示的小數位數的話前面要加上fixed
。
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int tc;
cin>>tc;
while(tc--)
{
int people;
cin>>people;
int grade[people],sum=0;
for(int i=0;i<people;i++)
{
cin>>grade[i];
sum+=grade[i];
}
float average=(float)sum/people;
int count=0;
for(int i=0;i<people;i++)
{
if(grade[i]>average)
count+=1;
}
cout<<fixed<<setprecision(3)<<(float)count/people*100<<'%'<<endl;
}
}
現在要統計n個人,他們的國籍與姓名。
並計算出這n個人中,每個國家佔有多少人。(代表名字是個屁)
輸出時,請依國家名字順序排序。(ABCD)
這題我的寫法....嗯....到現在看還是覺得挺帥的XD
這並不是Lucky cat上一顆星的題目,是我在考cpe時太閒,第一次嘗試用vector的程式。(這程式前沒用過
因為名字並不重要,所以我們建一個vector然後將所有國家名字依序放進去。
放完後直接用<algorithm>
的sort()
進行排序((自動幫我們排好abc,帥爆!
排好後就開始進行數數,數到與前面國家不同就代表前面國家以統計完畢可以輸出了,數到最後一個print出來,這件事也就完結了。
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n;
string nation,name;
vector<string> infor;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>nation;
getline(cin,name);
infor.push_back(nation);
}
sort(infor.begin(),infor.end());
int count;
string temp="";
for(int i=0;i<n;i++)
{
if(temp!=infor[i])
{
if(i!=0)
cout<<temp<<" "<<count<<endl;
temp=infor[i];
count=1;
}
else
count++;
if(i==n-1)
cout<<temp<<" "<<count<<endl;
}
}
學習,是自己的事。
努力,也是自己的事。
在這世界上,沒有什麼事情努力後不會有成果。
相信自己,成就自己。
引自 yueh 的 主題說明:
你的這段話 好勵志!!!
在這世界上,沒有什麼事情努力後不會有成果。
推推